import json

from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from rest_framework.views import APIView

from apps.cart.models import Cart
from apps.cart.serializers import CartSerializers
from utils import ResponseMessage


# Create your views here.

class CartAPIView(APIView):
    # @todo 后续补充登录权限验证
    """
    处理POST请求以更新购物车信息。
    从请求中提取email、sku_id和nums，以更新或创建购物车条目。
    如果购物车中已存在相同的email和sku_id且未删除的条目，则累加数量。
    否则，将创建一个新的购物车条目。
    参数: - request: 请求对象，包含要更新的购物车信息。
    返回: - HttpResponse对象，表示更新操作成功。
    """

    def post(self, request):
        # 提取请求数据
        request_data = request.data
        email = request_data.get("email")
        sku_id = request_data.get("sku_id")
        nums = request_data.get("nums")
        is_delete = request_data.get("is_delete")

        # 判断数据是否存在
        data_exists = Cart.objects.filter(email=email, is_delete=0, sku_id=sku_id)
        # 如果数据已存在，则获取该数据并更新数量
        if data_exists.exists():
            # 查询购物车中是否存在指定商品，通过email、商品SKU ID以及是否删除的状态来查询购物车数据
            exists_cart_data = data_exists.get(
                email=email,
                is_delete=0,
                sku_id=sku_id
            )
            # 将新的数量与已存在购物车中的数量相加
            if is_delete == 0:
                new_nums = nums + exists_cart_data.nums
                request_data['nums'] = new_nums
            elif is_delete == 1:
                request_data["nums"] = exists_cart_data.nums
            # 反序列化
            cart_ser = CartSerializers(data=request_data)
            cart_ser.is_valid(raise_exception=True)
            # 更新购物车条目
            Cart.objects.filter(
                email=email,
                sku_id=sku_id,
                is_delete=0
            ).update(**cart_ser.data)
            if is_delete == 0:
                return ResponseMessage.CartResponse.success("更新成功")
            elif is_delete == 1:
                return ResponseMessage.CartResponse.success("删除成功")

        else:
            cart_ser = CartSerializers(data=request_data)
            cart_ser.is_valid(raise_exception=True)
            Cart.objects.create(**cart_ser.data)
            return ResponseMessage.CartResponse.success("插入成功")

    def get(self, request):
        """
        获取购物车信息,根据请求中的email参数，查询未删除的购物车记录，并返回查询结果。
        参数:- request: 请求对象，包含GET请求数据。
        返回:- 购物车查询结果，以JSON格式返回。
        """
        # 从请求中获取email参数
        email = request.GET.get("email")
        # 查询与email关联且未删除的购物车记录
        cart_result = Cart.objects.filter(email=email, is_delete=0)
        # 对查询结果进行序列化，以便于传输
        cart_ser = CartSerializers(instance=cart_result, many=True)
        # 返回购物车信息查询成功的响应
        return ResponseMessage.CartResponse.success(cart_ser.data)
